import { spawn } from 'child_process';
import fs from 'fs';
import path from 'path';

/**
 * 获取视频或音频文件的详细信息
 * @param {string} filePath - 视频或音频文件的路径
 * @returns {Promise<Object>} - 返回一个包含文件详细信息的Promise对象
 */
const detection = (filePath) => {
  return new Promise((resolve, reject) => {
    // 检查文件是否存在
    if (!fs.existsSync(filePath)) {
      return reject(new Error(`文件不存在: ${filePath}`));
    }

    // 执行 ffprobe 命令获取媒体信息
    const ffprobe = spawn('ffprobe', [
      '-v', 'quiet',           // 减少冗余输出
      '-print_format', 'json', // 以JSON格式输出
      '-show_format',          // 显示格式信息
      '-show_streams',         // 显示流信息
      filePath                 // 输入文件
    ]);

    let outputData = '';
    let errorData = '';

    // 收集标准输出
    ffprobe.stdout.on('data', (data) => {
      outputData += data.toString();
    });

    // 收集错误输出
    ffprobe.stderr.on('data', (data) => {
      errorData += data.toString();
    });

    // 处理命令执行完成事件
    ffprobe.on('close', (code) => {
      if (code === 0) {
        try {
          // 解析JSON输出
          const mediaInfo = JSON.parse(outputData);
          
          // 提取关键信息并格式化
          const formattedInfo = {
            format: mediaInfo.format || {},
            streams: mediaInfo.streams || [],
            duration: mediaInfo.format?.duration || 0,
            size: mediaInfo.format?.size || 0,
            bitRate: mediaInfo.format?.bit_rate || 0,
            videoStreams: mediaInfo.streams?.filter(stream => stream.codec_type === 'video') || [],
            audioStreams: mediaInfo.streams?.filter(stream => stream.codec_type === 'audio') || []
          };
          
          resolve(formattedInfo);
        } catch (error) {
          reject(new Error(`解析媒体信息失败: ${error.message}`));
        }
      } else {
        // 命令执行失败
        reject(new Error(`ffprobe 进程退出，错误码: ${code}\n${errorData}`));
      }
    });

    // 处理可能的错误
    ffprobe.on('error', (err) => {
      reject(new Error(`无法启动 ffprobe 进程: ${err.message}`));
    });
  });
};

export default detection;